home *** CD-ROM | disk | FTP | other *** search
- TITLE 32-Bit x 32-Bit Unsigned Multiply (EX41.ASM)
- PAGE ,132
- EX41_DATA SEGMENT PARA 'DATA'
- HI_MCND DW ?
- LO_MCND DW ?
- HI_PP1 DW ?
- LO_PP1 DW ?
- HI_PP2 DW ?
- LO_PP2 DW ?
- HI_PP3 DW ?
- LO_PP3 DW ?
- HI_PP4 DW ?
- LO_PP4 DW ?
- EX41_DATA ENDS
- EX41_CODE SEGMENT PARA 'CODE'
- PUBLIC MULU32
- MULU32 PROC FAR
- ASSUME CS:EX41_CODE,DS:EX41_DATA
- ;
- ; Initialize the data segment address.
- ;
- PUSH DS ;Save caller's DS and Di
- PUSH DI
- MOV DI,EX41_DATA ;Initialize DS
- MOV DS,DI
- ;
- ; The main program follows.
- ;
- MOV HI_MCND,DX ;Save multiplicand in memory
- MOV LO_MCND,AX
- MUL BX ;Form partial product #1
- MOV HI_PP1,DX ; and save it in memory
- MOV LO_PP1,AX
- MOV AX,HI_MCND ;Form partial product #2
- MUL BX
- MOV HI_PP2,DX ; and save it in memory
- MOV LO_PP2,AX
- MOV AX,LO_MCND ;Form partial product #3
- MUL CX
- MOV HI_PP3,DX ; and save it in memory
- MOV LO_PP3,AX
- MOV AX,HI_MCND ;Form partial product #4
- MUL CX
- MOV HI_PP4,DX ; and save it in memory
- MOV LO_PP4,AX
- ;
- ; Add the partial products to form the final 64-bit product.
- ;
- MOV AX,LO_PP1 ;Low 16 bits
- MOV BX,HI_PP1 ;Form mid-lower 16 bits
- ADD BX,LO_PP2 ; with sum #1
- ADC HI_PP2,0
- ADD BX,LO_PP3 ; and sum #2
- MOV CX,HI_PP2 ;Form mid-upper 16 bits
- ADC CX,HI_PP3 ; with sum #3
- ADC HI_PP4,0
- ADD CX,LO_PP4 ; and sum #4
- MOV DX,HI_PP4 ;Form high 16 bits
- ADC DX,0 ; including propagated carry
- POP DI ;Restore caller's registers
- POP DS
- RET
- MULU32 ENDP
- EX41_CODE ENDS
- END MULU32
-